/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package openfireconnection.user.impl;

import batis.MyBatisSqlSessionFactory;
import com.mysql.jdbc.PreparedStatement;
import java.util.ArrayList;
import openfireconnection.user.ManejadorUsers;
import openfireconnection.user.model.UserModel;
import org.apache.ibatis.session.SqlSession;

/**
 * Implementación de la interfaz para el manejo de gusuarios de OpenFire
 * @author Miguel y Juanan - Telecor
 */
public class ManejadorUsersImpl implements ManejadorUsers
{
    private SqlSession session = null;
  /**
   * Constructor de la clase que implementa los métodos para el manejo de
   * grupos en OpenFire
   */  
    public ManejadorUsersImpl() 
    {
        session = MyBatisSqlSessionFactory.getSqlSessionFactory().openSession();
    }
/**
 * Cuenta el número usuarios de OpenFire
 * @return El número de usuarios pertenecientes a OpenFire
 */
    @Override
    public int countUsers() 
    {
        return session.getMapper(ManejadorUsers.class).countUsers();
    }
/**
 * Cuenta el número de amigos de un usuario
 * @param userName Nombre del usuario del que se desea contar los amigos
 * @return El número de amigos del usuario especificado
 */
    @Override
    public int countFriends(String userName) 
    {
        return session.getMapper(ManejadorUsers.class).countFriends(userName);
    }
/**
 * Comprueba si un usuario existe en OpenFire
 * @param userName NOmbre de usuario que se desea comprobar
 * @return Devuelve 1 si el usuario existe y 0 si no existe
 */
    @Override
    public boolean userExists(String userName) 
    {
        ArrayList<String> usersList=getNameUsers();
        for(String user:usersList)
        {
            if(user.equals(userName))
            {
                return true;
            }
        }
        return false;
    }
/**
 * Recoge el dominio del servidor donde se encuentra OpenFire
 * @return El dominio del servidor
 */
    @Override
    public String getDomain() 
    {
        return session.getMapper(ManejadorUsers.class).getDomain();
    }
/**
 * Se añade un usuario
 * @param user Usuario que se desea agregar a OpenFire
 * @return devuelve 0 si no se ha agregado el usuario
 */
    @Override
    public int addUser(UserModel user) 
    {
        try 
        {
            return session.getMapper(ManejadorUsers.class).addUser(user);
        } 
        catch(Exception e) 
        {
            System.out.println("Excepción: "+e);
            return 0;
        }
         
    }
/**
 * Borra un usuario especificado de OpenFire
 * @param userName Nombre del usuario a eliminar
 * @return devuelve 0 si no se ha borrado el usuario
 */
    @Override
    public int deleteUser(String userName) 
    {
        try 
        {
            return session.getMapper(ManejadorUsers.class).deleteUser(userName);
        } 
        catch(Exception e) 
        {
            System.out.println("Excepción: "+e);
            return 0;
        }
    }
/**
 * Recoge los datos de un usuario de Openfire especificado
 * @param userName Nombre de usuario del que se piden los datos
 * @return devuelve un usuario con sus datos
 */
    @Override
    public UserModel getUser(String userName) 
    {
        return session.getMapper(ManejadorUsers.class).getUser(userName);
    }
/**
 * Comprueba si un usuario es administrador de OpenFire
 * @param userName Nombre de usuario a comprobar
 * @return Devuelve true si el usuario es administrador y false si no lo es
 */
    public boolean isAdminOpenFire(String userName) 
    {
        String autorizados=getAuthorizedJIDs();
        String admins[]=autorizados.split(",");
        String dominio=getDomain();
        
        for (String administrators:admins)
        {
            String user=userName+"@"+dominio;
            if (administrators.equals(user))
            {
                return true;
            }
        }
        return false;
    }
/**
 * Recoge la lista de administradores de OpenFire
 * @return Devuelve la lista de administradores de OpenFire
 */
    @Override
    public String getAuthorizedJIDs() 
    {
        return session.getMapper(ManejadorUsers.class).getAuthorizedJIDs();
    }
/**
 * Elimina un administrador de OpenFire
 * @param userName Nombre de administrador que se desea borrar
 */
    @Override
    public void deleteAdminOpenFire(String userName) 
    {
        String dominio=getDomain();
        int tamaño = 0;
        String autorizados=getAuthorizedJIDs();
        String admins[]=autorizados.split(",");
        if (isAdminOpenFire(userName))
        {
            StringBuilder administradores=new StringBuilder();
            for (String administrators:admins)
            {
                if (administrators.equals(userName+"@"+dominio))
                {
                }
                else
                {
                    administradores.append(administrators+",");
                    tamaño=administradores.length();           
                }
            }
            administradores.deleteCharAt(tamaño-1);
            session.getMapper(ManejadorUsers.class).deleteAdminOpenFire(administradores.toString());
        }
        else
        {
            
        }
    }
/**
 * Comprueba si dos usuarios de OpenFire son amigos
 * @param userName Nombre del primer usuario
 * @param userNameFriend nombre del segundo usuario
 * @return Devuelve true si los usuarios son amigos y false si no lo son
 */
    @Override
    public boolean isFriend(String userName, String userNameFriend) 
    {
        ArrayList<String> listaAmigos=new ArrayList<String>();
        listaAmigos=getFriends(userName);
        for(String amigo:(ArrayList<String>)listaAmigos)
        {
            if(userNameFriend.equals(amigo)) return true;
        }
        
        return false;
    }
/**
 * Recoge la lista de amigos para un usuario de OpenFire indicado
 * @param userName Nombre de usuario para buscar amigos
 * @return Lista de amigos
 */
    @Override
    public ArrayList<String> getFriends(String userName) 
    {
        ArrayList<String> friendList=new ArrayList<String>();
        friendList=session.getMapper(ManejadorUsers.class).getFriends(userName);
        return friendList;
    }
/**
 * Recoge los nombres de usuarios que forman parte de OpenFire
 * @return La lista de nombres de usuarios existentes en OpenFire
 */
    @Override
    public ArrayList<String> getNameUsers() {
        ArrayList<String> usersList=new ArrayList<String>();
        usersList=session.getMapper(ManejadorUsers.class).getNameUsers();
        return usersList;
    }

    
}
